package models

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"week_three/car_srv/common/global"
)

func InitMysql(mysqlFunc func(DB *gorm.DB) error) error {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		global.UserConfig.MysqlConf.Username, global.UserConfig.MysqlConf.Password, global.UserConfig.MysqlConf.Host, global.UserConfig.MysqlConf.Port, global.UserConfig.MysqlConf.Database,
	)
	db, err := gorm.Open(mysql.New(mysql.Config{
		DSN:                       dsn,   // DSN data source name
		DefaultStringSize:         256,   // string 类型字段的默认长度
		DisableDatetimePrecision:  true,  // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,  // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
	}), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true,
		},
	})
	if err != nil {
		panic(err)
	}
	tx, _ := db.DB()
	defer tx.Close()
	return mysqlFunc(db)
}

func DatabaseMigrate() error {
	return InitMysql(func(DB *gorm.DB) error {
		return DB.AutoMigrate(&Car{}, &CarType{})
	})

}

// 汽车表
type Car struct {
	gorm.Model
	Name    string `gorm:"varchar(255);not null;comment:车名"`
	Price   int    `gorm:"int(11);not null;comment:价格（万）"`
	Brand   string `gorm:"varchar(255);not null;comment:汽车品牌"`
	CarType int    `gorm:"tinyint(2);not null;comment:汽车型号"`
	Detail  string `gorm:"TEXT;not null;comment:汽车详情"`
}

// 汽车分类表  无限极分类
type CarType struct {
	gorm.Model
	Title string     `gorm:"varchar(255);not null;comment:类型名称"`
	Pid   int        `gorm:"int(11);comment:父级id"`
	Cars  []*CarType `gorm:"foreignKey:Pid"`
}
